{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true,
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "## Pytorch Activation Function 激活函数\n",
    "\n",
    "* Relu\n",
    "\n",
    "* Sigmoid\n",
    "\n",
    "* Tanh\n",
    "\n",
    "* softplus\n",
    "\n",
    "* softmax"
   ]
  },
  {
   "cell_type": "code",
   "source": [
    "import torch\n",
    "import torch.nn.functional as F\n",
    "from torch.autograd import Variable\n",
    "import matplotlib.pyplot as plt"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "execution_count": null,
   "outputs": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "outputs": [],
   "source": [
    "# fake data\n",
    "x = torch.linspace(-5, 5, 200)   # 使用torch生成500个等差数据\n",
    "x = Variable(x)\n",
    "x_np = x.data.numpy()            # 转换成 np 类型\n",
    "\n",
    "data = {\n",
    "    'relu': F.relu(x).data.numpy(),\n",
    "    'sigmoid': torch.sigmoid(x).data.numpy(),\n",
    "    'tanh': torch.tanh(x).data.numpy(),\n",
    "    'softplus': F.softplus(x).data.numpy(),\n",
    "    'softmax': F.softmax(x).data.numpy()\n",
    "}"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 576x432 with 5 Axes>",
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAekAAAFlCAYAAADPvBA0AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAABGeElEQVR4nO3dd3hUVf7H8fcXiIRqAWwETXRFpShgYFVUQCwoCHZ0RbFiWVxRUMSyspbVVVfRH4iy2MUKFppUEQRRCRipooBRgoWq1ABJzu+Pk0CIAYaQzL0z83k9z32m3cz9JHDmO/fec88x5xwiIiISPhWCDiAiIiIlU5EWEREJKRVpERGRkFKRFhERCSkVaRERkZBSkRYREQmpSkEHKK527douNTU16BgioTdz5syVzrk6ZfFeZvYS0AFY7pxrVMLrBjwDnAtsBK52zs3a3fuqPYtEZmftOXRFOjU1lYyMjKBjiISemf1Yhm/3CtAfeG0nr58DHFWw/BUYWHC7S2rPIpHZWXvW4W6RsHHOL1HdpJsCrN7FKp2A15z3BbCfmR0SnXQiiSt0e9IiCc056NULcnOhXz8wCzpRobrA0iKPswue+6X4imbWDegGcNhhh0UlnEi5ysuDNWtg1SpYuxbWrfPL+vXb7xd9bsMG2LRp+/LMM9CkSak2rSItEhZ5eXDTTTB4MPzjH0GnKTXn3CBgEEB6errGHZZwcs4X3qVLITt7++0vv8DKlX5Ztcrfrl69+6NbZlC9OtSoAVWrQpUq25f8/FLHjIkivXXrVrKzs8nJyQk6SplLTk4mJSWFpKSkoKNIkLZuhSuvhHfegfvugwcfDNNeNMAyoF6RxykFz+2xeG7PZUmfDWXAOfjtN/juO1i40C/ffeeXpUth48Yd169YEQ46COrUgdq14fjj/W3hUqsW1KzpC3HhUrQwVyj7M8gxUaSzs7OpUaMGqampWLg+uPaKc45Vq1aRnZ1NWlpa0HEkKDk5cMklMHIk/Oc/cNddQScqyXCgu5m9je8w9odz7k+HuiMRr+25LOmzoRScgyVLYOZMmDVr+7Jq1fZ1kpPhqKOgUSPo0AFSUvxSr56/PfhgX6hDJCaKdE5OTlw2aDOjVq1arFixIugoEpT166FTJ5g0CZ57Dm6+OZAYZvYW0BqobWbZwANAEoBz7nlgNP7yq0X4S7CuKe224rU9lyV9NkQgPx/mz4fJk2HKFL/8+qt/LSnJF+Lzz4fjjoOjj/bLYYeVy95ueYqJIg3EbYOO199LIrBmDZx7LsyYAa+9Bl26BBbFOXf5bl53wN/Lanv6f797+huVYO1aGD/eH3UaPRqWL/fPp6RA27Zw6qnQvDk0bAiVKwebtYzETJGOFdWrV2f9+vVBx5Cw++03OOss+PZbGDrUf+OXwFx//fXccccdNGjQoNy2ce655/Lmm2+y33777fB83759qV69Or169Sq3bce0DRvgww/hzTd9gd66FfbfH845B848E1q1gtTUsPXhKDMq0qXgnMM5R4UYO2wiIbF0KZxxhu9JOnKk/6CRQA0ePLjctzF69Ohy30bccA4+/dRf6fDhh76DV716/qqHjh3h5JOhUmKUL1WZCGVlZXH00Udz1VVX0ahRIx566CGaN2/OcccdxwMPPPCn9T/99FM6dOiw7XH37t155ZVXophYQmnRIjjlFH/ubOxYFegAbNiwgfbt23P88cfTqFEj3nnnHVq3br1tZLQXX3yR+vXr06JFC2644Qa6d+8OwNVXX83NN9/MiSeeyBFHHMGnn37Ktddey7HHHsvVV1+97f3feustGjduTKNGjejdu/e251NTU1m5ciUAjzzyCPXr1+eUU05h4cKF0fvlw27dOhgwwJ9PPv10+Phjf9XDlCmQlQVPPgmnnZYwBRpicU+6Rw/IzCzb92zSxA8csRvff/89r776KmvXrmXo0KF89dVXOOfo2LEjU6ZM4bTTTivbXBJf5s71RTk313cUa9Ys6ETBC6A9jxkzhkMPPZRRo0YB8McffzBw4EAAfv75Zx566CFmzZpFjRo1OP300zn++OO3/eyaNWuYPn06w4cPp2PHjkybNo3BgwfTvHlzMjMzOfDAA+nduzczZ85k//3356yzzuLDDz/k/CKnM2bOnMnbb79NZmYmubm5NGvWjBNOOKFs/waxZuVKePpp6N/fn3c+4QR4+WXo3NlfZ5zAtCe9Bw4//HBOPPFExo0bx7hx42jatCnNmjXj22+/5fvvvw86noTZjBn+3FmFCr43qgp0YBo3bsz48ePp3bs3n332Gfvuu++217766itatWrFAQccQFJSEpdccskOP3veeedhZjRu3JiDDjqIxo0bU6FCBRo2bEhWVhYzZsygdevW1KlTh0qVKnHFFVcwZcqUHd7j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3XVkZGRgZlx77bXcfvvtZft3kPLjnD8t99//wpVXwksv+b405SD2inRAHnvsMebOnUtmZia5ubls3LiRmjVrsnLlSk488UQ6duwIwPfff89bb73F//73Py699FKGDRtGly5dAMjNzeWrr75i9OjR/Otf/2LChAlB/krRt349tG8PU6bA449Dr147DuYhEgVjxozh0EMPZdSoUQD88ccfNGrUiIkTJ1K/fn2uuuoqBg4cSI8ePZg6dSodOnTg4osv/lPB7du3L7Nnz+aLL75gw4YNNG3alPbt20eUITMzk2XLljF37lzAH6mTGJGXBzfdBIMHQ/fu8Mwz5TquQuwV6d3s8UaDc4577rmHKVOmUKFCBZYtW8Zvv/0GQFpaGk2aNAHghBNOICsra9vPXXjhhSU+nxA2bPAFeto034P7cvUnFAJpz40bN6Znz5707t2bDh06ULNmTdLS0qhfvz4AXbt2ZcCAAfTo0WO379WpUyeqVKlClSpVaNOmDV999dW29r8rRxxxBEuWLOHWW2+lffv2nHXWWXv5W0lUbN7s95zfew/uu8+ftivnHQ2dky6FIUOGsGLFCmbOnElmZiYHHXTQttGTKleuvG29ihUrkpubu+1x4WvFn497W7fChRfC1Km+F6QKtASofv36zJo1i8aNG3Pffffx4Ycflvq9il8mVfxxpUqVyM/P3/a48HNi//3355tvvqF169Y8//zzXH/99aXOIFGyfj2cd54v0E8+CQ89FJUjgSrSEapRowbr1q0D/OGxAw88kKSkJCZNmsSPP4Z+xsDgOOc7Vowb5weZV4GWgP38889UrVqVLl26cOeddzJ9+nSysrJYtGgRAK+//jqtWrX6088V/Qwo9NFHH5GTk8OqVav49NNPad68+Q6vp6amkpmZSX5+PkuXLuWrr74CYOXKleTn53PRRRfx8MMPM2vWrHL6baVMrF7th/mcONGff+7ZM2qbjr3D3QGpVasWLVu2pFGjRjRv3pxvv/2Wxo0bk56ezjHHHBN0vPDq3x9eeAF69/aDk4gEbM6cOdx5551UqFCBpKQkBg4cyB9//MEll1yyrePYTTfd9Kefa9OmDY899hhNmjShT58+ABx33HG0adOGlStXcv/993PooYfucCqrZcuWpKWl0aBBA4499liaNWsGwLJly7jmmmu27WU/+uij5f+LS+n8/DOc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\n"
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "keys = list(data.keys())\n",
    "plt.figure(1, figsize=(8, 6))    # 分别绘制折线图\n",
    "nrow = len(keys) // 2 + len(keys) % 2\n",
    "for i,key in enumerate(keys):\n",
    "    plt.subplot(nrow,2, i+1)\n",
    "    plt.plot(x_np, data[key], c='red', label=key)\n",
    "    # plt.ylim((-1, 5))\n",
    "    plt.legend(loc='best')\n",
    "plt.show()\n"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "### 分类问题\n",
    "\n",
    "|分类问题名称\t|输出层使用激活函数\t|对应的损失函数|\n",
    "|:----|:----|:----|\n",
    "|二分类\t|sigmoid函数\t|二分类交叉熵损失函数BCELoss()--不带sigmoid\n",
    "、BCEWithLogitsLoss()--带sigmoid|\n",
    "|多分类\t|softmax函数|\t多类别交叉熵损失函数nn.NLLLoss()--不带LogSoftmax、\n",
    "nn.CrossEntropy()--带LogSoftmax|\n",
    "|多标签分类\t|sigmoid函数\t|二分类交叉熵损失函数\n",
    "BCELoss()、BCEWithLogitsLoss()MultiLabelSoftMarginLoss()|\n",
    "\n",
    "\n",
    "https://zhuanlan.zhihu.com/p/372628727"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0.5545, -0.9585, -0.3273, -0.9355,  0.3033,  0.2809,  0.7884, -0.0440,\n",
      "          0.6760, -1.7179],\n",
      "        [-1.3398, -0.4131,  0.6856, -0.3410,  1.5637, -0.4730, -0.7981, -0.9067,\n",
      "         -0.5728, -0.6046],\n",
      "        [ 0.0170,  1.2865, -0.3690, -1.3579,  0.1657, -1.6883, -1.1429,  1.1850,\n",
      "         -0.5963, -0.7445],\n",
      "        [ 0.5207, -0.2618,  1.5272,  1.0998,  0.6311, -0.9665,  1.5180, -0.4584,\n",
      "         -0.8177,  0.0052],\n",
      "        [ 0.0336,  0.1819, -0.0642,  0.3756,  0.3783, -1.0178, -0.2458,  0.4910,\n",
      "          0.5886,  0.4864],\n",
      "        [ 0.1567, -0.0893,  0.5134,  0.0071, -0.6209, -0.3195, -0.7615, -1.5025,\n",
      "         -0.8795,  0.7883],\n",
      "        [-0.4469,  1.0083, -0.6687, -0.1454,  1.0557, -0.5521, -0.5653, -0.2942,\n",
      "         -2.0837,  0.1605],\n",
      "        [-0.2825, -1.0446,  0.1335,  1.2140, -0.7499,  0.3480, -0.3219,  0.4035,\n",
      "          0.9318, -1.3087],\n",
      "        [-0.5086, -0.5511,  0.2268, -2.2035,  1.3395,  0.0338,  1.0602,  0.1568,\n",
      "         -0.1141,  0.2027],\n",
      "        [ 0.4010, -0.3671,  0.4656,  2.1233, -0.7630, -0.4573,  1.3141, -1.2730,\n",
      "         -0.6676, -0.5803],\n",
      "        [ 0.9503, -0.4700, -1.3609,  0.5725,  1.7818, -0.4722, -1.8885,  0.9476,\n",
      "          0.7985,  0.2835],\n",
      "        [-1.1044,  1.5097, -0.4275,  0.0558,  1.9546, -1.3241,  1.2142,  0.8675,\n",
      "         -0.4437, -0.2445],\n",
      "        [-0.8515, -0.5184,  0.0369,  0.5524,  0.2857, -1.1573,  1.3321, -0.7281,\n",
      "          0.5155, -0.1740],\n",
      "        [ 1.4696, -0.0773,  1.6081, -0.5434, -1.3328,  0.0575,  2.5395, -1.5943,\n",
      "          0.6988,  0.0498],\n",
      "        [-3.0155, -0.2789, -0.8540, -1.6933,  0.3773,  2.5654, -1.0942, -0.2052,\n",
      "         -0.0590,  1.2369],\n",
      "        [-0.5684,  0.6426,  0.2567, -0.1353, -1.5274, -0.8806, -0.0293, -0.6717,\n",
      "         -1.6192,  0.1808]])\n",
      "tensor([1., 1., 1., 1., 1., 1., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0.])\n"
     ]
    }
   ],
   "source": [
    "import torch\n",
    "import torch.nn as nn\n",
    "\n",
    "model = nn.Linear(10, 1)\n",
    "criterion = nn.BCEWithLogitsLoss()\n",
    "\n",
    "x = torch.randn(16, 10)\n",
    "y = torch.empty(16).random_(2)  # (16, )\n",
    "print(x)\n",
    "print(y)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([ 0.4870,  0.8617, -1.0304,  1.6087, -0.2026,  0.4560,  0.3682,  0.0670,\n",
      "         0.7918,  1.1718, -0.3665,  0.2518,  0.5479,  1.2066, -0.0497, -0.0556],\n",
      "       grad_fn=<SqueezeBackward1>)\n",
      "tensor(0.7871, grad_fn=<BinaryCrossEntropyWithLogitsBackward>)\n"
     ]
    }
   ],
   "source": [
    "out = model(x)  # (16, 1)\n",
    "out = out.squeeze(dim=-1)  # (16, )\n",
    "\n",
    "loss = criterion(out, y)\n",
    "print(out)\n",
    "print(loss)\n"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}